package practiceProjects.DeleteAllComments;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * @Project ：learn_java
 * @File ：DeleteAllComments.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/9 16:13
 * @Description ：删除代码中所有的注释，即 '//' 及后面的同行的全部字符，不包括括号内，防止删除网页信息
 * @HowToUse: 先将需要进行操作的代码放在'DeleteAllCommentsSourceFile.txt'里，程序运行过后会生成一个'NoComment + 时间 .txt'
 * 的文件以返回结果。
 */

public class DeleteAllComments {
    public static void main(String[] args) {
        String sourceFile = "G:\\codes\\learn_java\\src\\practiceProjects\\DeleteAllCommentsSourceFile.txt";

        Calendar calendar = Calendar.getInstance();

        // 日期格式
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        String currentTime = "";

        try {
            currentTime = formatter.format(calendar.getTime())
                    .replaceAll("[ :-]", ""); // 正则表达式替换
        } catch (Exception e) {
            // 处理异常，例如记录日志或返回默认值
            System.err.println("时间格式化失败: " + e.getMessage());
        }

        // 可以更换路径，这里默认是保存到项目根目录
        String outputFile = "NoComment" + currentTime + ".txt";

        try (BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
             BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
            String line;
            while ((line = reader.readLine()) != null) {
                /*
                删除 // 及之后的所有字符，在引号内的除外
                统计之前的引号个数，如果前之和是奇数则在内，反之在外，可以删
                */
                int idx = line.indexOf("//");

                String substring = (idx == -1)
                        ? line
                        : line.substring(0, idx);

                // "//"在引号内，不进行操作
                if (idx == -1 ||
                        countCharInRange(line, '\'', 0, idx) % 2 == 1 ||
                        countCharInRange(line, '\"', 0, idx) % 2 == 1) {
                    writer.write(line);
                } else {
                    writer.write(substring);
                }

                writer.newLine(); // 添加换行符
            }
            System.out.println("文件操作完成，已保存至" + outputFile);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("程序出错，已停止！");
        }
    }

    /**
     * 统计字符串的指定范围内指定字符的出现次数
     * @param s 字符串
     * @param c 字符
     * @param left 左边界，包含
     * @param right 右边界，包含
     * @return 出现次数
     */
    public static int countCharInRange(String s, char c, int left, int right) {
        int len = s.length();

        // 检查左右边界是否合法
        if (left < 0 || left >= len || right < 0 || right >= len || left > right) {
            throw new IndexOutOfBoundsException("左右边界不合法，左边界必须在 0 到字符串长度之间，右边界必须大于等于左边界且在 0 到字符串长度之间");
        }

        int count = 0;
        // 遍历指定范围的字符串
        for (int i = left; i <= right; i++) {
            if (s.charAt(i) == c) {
                count++;
            }
        }
        return count;
    }
}
